﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace TowerDefenseXNA
{
    class Torre : Objeto//Herança extends 
    {
        SoundEffect efeitoSonoro;

        public animacao andando_cima;
        public animacao andando_baixo;
        public animacao andando_esquerda;
        public animacao andando_direita;
        public animacao andando_parado;

        public SpriteFont Arial14;

        public int direcao;
        public int width;
        public int height;

        public double attackSpeed = 1;
        public double lastAttack = 0;
        public int health = 3;

        public bool attacking = false;

        public Animations hit;

        animacao animacao_atual;
        
        public int jogador;

        static List<Torre> lista = new List<Torre>();

        public Torre(Texture2D imagem, GameWindow Window, SoundEffect efeitoSonoro)
            :base(imagem, Window)
        {

            direcao = 0;
           posicao = new Vector2(50, 50);
           velocidade = new Vector2(3, 3);
           this.efeitoSonoro = efeitoSonoro;

  
           width = (imagem.Width / 3);
           height = (imagem.Height / 5);

           andando_cima = new animacao();
           andando_cima.qtd_quadros = 3;
           andando_cima.quadros_seg = 9;
           andando_cima.Y = 0;
           andando_cima.quadro_X = imagem.Width / andando_cima.qtd_quadros;
           andando_cima.quadro_Y = imagem.Height / 5;

           andando_direita = new animacao();
           andando_direita.qtd_quadros = 3;
           andando_direita.quadros_seg = 9;
           andando_direita.Y = ((imagem.Height / 5) * 3);
           andando_direita.quadro_X = imagem.Width / andando_direita.qtd_quadros;
           andando_direita.quadro_Y = imagem.Height / 5;

           andando_baixo = new animacao();
           andando_baixo.qtd_quadros = 3;
           andando_baixo.quadros_seg = 9;
           andando_baixo.Y = ((imagem.Height / 5)*2);
           andando_baixo.quadro_X = imagem.Width / andando_direita.qtd_quadros;
           andando_baixo.quadro_Y = imagem.Height / 5;

           andando_esquerda = new animacao();
           andando_esquerda.qtd_quadros = 3;
           andando_esquerda.quadros_seg = 9;
           andando_esquerda.Y = imagem.Height / 5; 
           andando_esquerda.quadro_X = imagem.Width / andando_esquerda.qtd_quadros;
           andando_esquerda.quadro_Y = imagem.Height/5;

           

           andando_parado = new animacao();
           andando_parado.qtd_quadros = 3;
           andando_parado.quadros_seg = 1;
           andando_parado.Y = ((imagem.Height / 5) * 4);
           andando_parado.quadro_X = imagem.Width / andando_parado.qtd_quadros;
           andando_parado.quadro_Y = imagem.Height / 5;

            //TO DO fazer metodo Definir Animacoes
          animacao_atual = andando_cima;

          colisao = new Rectangle((int)posicao.X, (int)posicao.Y, animacao_atual.quadro_X, animacao_atual.quadro_Y);

          lista.Add(this);

        }

        public bool Bateu(Objeto outro)
        {
            if ( this.Colisao.Intersects(outro.Colisao) )
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        //sobrecarregamento ou overload
        public override void Update(GameTime gameTime)
        { }

        public void Update(GameTime gameTime, KeyboardState teclado_atual, KeyboardState teclado_anterior, MouseState mouse_atual, MouseState mouse_anterior)
       {
            
           colisao.X = (int)posicao.X;
            colisao.Y = (int)posicao.Y;
            colisao.Width = animacao_atual.quadro_X;
            colisao.Height = animacao_atual.quadro_Y;

           if (jogador != 2)
           {
               if (teclado_atual.IsKeyDown(Keys.Right))
               {
                   posicao.X += velocidade.X;
                   animacao_atual = andando_direita;
                   direcao = 1;
               }

               if (teclado_atual.IsKeyDown(Keys.Left))
               {
                   posicao.X -= velocidade.X;
                   animacao_atual = andando_esquerda;
                   direcao = 3;
               }

               if (teclado_atual.IsKeyDown(Keys.Down))
               {
                   posicao.Y += velocidade.Y;
                   animacao_atual = andando_baixo;
                   direcao = 2;
               }

               if (teclado_atual.IsKeyDown(Keys.Up))
               {
                   posicao.Y -= velocidade.Y;
                   animacao_atual = andando_cima;
                   direcao = 0;
               }

               if(!teclado_atual.IsKeyDown(Keys.Up) && !teclado_atual.IsKeyDown(Keys.Down) && !teclado_atual.IsKeyDown(Keys.Left) && !teclado_atual.IsKeyDown(Keys.Right))
                   animacao_atual = andando_parado;


        //attaque


               if (teclado_atual.IsKeyDown(Keys.Z))
               {
                   if ((gameTime.TotalGameTime.TotalSeconds - this.lastAttack) >= this.attackSpeed)
                   {
                       this.lastAttack = gameTime.TotalGameTime.TotalSeconds;
                       Attack(gameTime, hit);
                       this.attacking = true;
                   }
               }

           

             

               //fazer enum e setar animacao aqui com default
           }

           if (posicao.X >= window.ClientBounds.Width - colisao.Width)
               posicao.X = window.ClientBounds.Width - colisao.Width;

           if (posicao.Y >= window.ClientBounds.Height - colisao.Height)
               posicao.Y = window.ClientBounds.Height - colisao.Height;

           if (posicao.X <= 0)
               posicao.X = 0;

           if (posicao.Y <= 0)
               posicao.Y = 0;

           if ((mouse_atual.LeftButton == ButtonState.Pressed))
           {
               posicao = new Vector2(mouse_atual.X, mouse_atual.Y);
               if (mouse_anterior.LeftButton != ButtonState.Pressed)
               {
                   efeitoSonoro.Play();
               }
           }

           
       }

        public void Draw(GameTime gameTime, SpriteBatch spriteBatch)
        {
            base.Draw(gameTime, spriteBatch, animacao_atual);
        }

        public void Attack(GameTime gameTime,  Animations hit)
        {
            for (int i = 0; i < lista.Count; i++)
            {
                if (hit.Colisao.Intersects(lista[i].Colisao))
                {
                   // hit.sendAnimation(gameTime);
                    if (lista[i].jogador != 1)
                    {
                        hit.visivel = true;
                        lista[i].health--;
                        efeitoSonoro.Play();
                        if (lista[i].health <= 0)
                        {
                            lista[i].visivel = false;
                        }
                    }
                   
                }
            }
        }
       
    }
}
